package com.xajh.duoduo.impl.process;


import com.xajh.duoduo.abs.AbsProcessor;
import com.xajh.duoduo.eunm.position.*;
import com.xajh.duoduo.eunm.process.ProcessEnum;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Service;

import java.awt.*;
import java.awt.event.InputEvent;

/**
 * 辎重
 */
@Service
public class ImpedimentaProcessor extends AbsProcessor implements InitializingBean {
    private final MutiActivityPosition[] mutiActivityPositions = MutiActivityPosition.values();
    private final FactionPosition[] factionPositions = FactionPosition.values();
    private final FactionActivityPosition[] factionActivityPositions = FactionActivityPosition.values();
    private final FactionNoticePosition[] factionNoticePositions = FactionNoticePosition.values();
    private final FactionLocationPosition[] factionLocationPositions = FactionLocationPosition.values();
    private final MapPosition[] mapPositions = MapPosition.values();
    private final SearchRoadPosition[] searchRoadPositions = SearchRoadPosition.values();
    private final SocialClientPosition[] socialClientPositions = SocialClientPosition.values();
    private final ImpedimentaPersonPosition[] impedimentaPersonPositions = ImpedimentaPersonPosition.values();
    private final MapClosePosition[] mapClosePositions = MapClosePosition.values();
    private final ConversationPosition[] conversationPositions = ConversationPosition.values();
    private final AnswerQuestionPosition[] answerQuestionPositions = AnswerQuestionPosition.values();
    private final SeasonImpedimentaPosition[] seasonImpedimentaPositions = SeasonImpedimentaPosition.values();
    private final ImpedimentaTeamPosition[] impedimentaTeamPositions = ImpedimentaTeamPosition.values();
    private final CreateTeamPosition[] createTeamPositions = CreateTeamPosition.values();
    private final VerifyCreateTeamPosition[] verifyCreateTeamPositions = VerifyCreateTeamPosition.values();
    private final ImpedimentaSearchTeam[] impedimentaSearchTeams = ImpedimentaSearchTeam.values();
    private final ImpedimentaStartPosition[] impedimentaStartPositions = ImpedimentaStartPosition.values();
    private final VerifyTeamActivityPosition[] verifyTeamActivityPositions = VerifyTeamActivityPosition.values();
    private final EmailPosition[] emailPositions = EmailPosition.values();
    private final EmailAllChoosePosition[] emailAllChoosePositions = EmailAllChoosePosition.values();
    private final EmailAllPickPosition[] emailAllPickPositions = EmailAllPickPosition.values();

    @Override
    public boolean process() throws Exception {
        Robot robot = new Robot();
        robot.setAutoWaitForIdle(true);
        //开始流程
        for (int i = 0; i < mutiActivityPositions.length; i++){
            //点击地图下方的活动展开键位
            clickMutiActivity(robot,i);

            //点击帮派按钮
            clickFaction(robot,i);

            //关闭通知弹窗
            clickFactionNotice(robot,i);

            //点击帮派界面的活动按钮
//            clickFactionActivity(robot,i);

            //点击进入帮派领地
            clickFactionLocation(robot,i);
        }

        //动画加载2分钟
        Thread.sleep(2 * 60 * 1000);

        //帮派辎重寻路
        for (int i = 0; i < mutiActivityPositions.length; i++){
            //点击地图
            clickMap(robot,i);
            //点击寻路
            clickSearchRoad(robot,i);
            //点击江湖客
            clickSocialClient(robot,i);
            //点击辎重接引人
            clickImpedimentaPerson(robot,i);
            //关闭地图框
            clickMapClose(robot,i);
        }

        //等待跑路
        Thread.sleep(10000);

        //组队
        for (int i = 0; i < mutiActivityPositions.length; i++){
            //对话
            clickConversation(robot,i);
            //点击对话确认键（帮会辎重）
            clickAnswerQuestion(robot,i);
            //选择四季辎重
            clickSeasonImpedimenta(robot,i);

            if(i == 0){
                //第一个便捷组队
                clickImpedimentaTeam(robot,i);
                //创建队伍
                clickCreateTeam(robot,i);
                //确认创建队伍
                clickVerifyCreateTeam(robot,i);
            }else {
                //其余的便捷组队
                clickImpedimentaSearchTeam(robot,i);
            }

        }

        //等待队员入队
        Thread.sleep(10000);

        //第一个点击对话
        clickConversation1(robot,0);
        //第一个点击对话确认键（帮会辎重）
        clickAnswerQuestion1(robot,0);
        //第一个点击开始运输
        clickImpedimentaStart(robot,0);
        //其余点击队伍确认
        for (int i = 1; i < mutiActivityPositions.length; i++){
            clickVerifyTeamActivity(robot,i);
        }

        //8分钟后领取邮件奖励
        robot.delay(8 * 60 * 1000);

        for (int i = 0; i < mutiActivityPositions.length; i++){
            clickEmail(robot,i);
            //全选邮件
            clickEmailAllChoose(robot,i);
            //一键领取
            clickEmailAllPick(robot,i);
        }


        return true;
    }

    private void clickEmailAllPick(Robot robot, int index) {
        robot.mouseMove(emailAllPickPositions[index].getX(), emailAllPickPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时0.3s
        robot.delay(300);
    }

    private void clickEmailAllChoose(Robot robot, int index) {
        robot.mouseMove(emailAllChoosePositions[index].getX(), emailAllChoosePositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时0.3s
        robot.delay(300);
    }

    private void clickEmail(Robot robot, int index) {
        robot.mouseMove(emailPositions[index].getX(), emailPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时0.3s
        robot.delay(300);
    }

    private void clickVerifyTeamActivity(Robot robot, int index) {
        robot.mouseMove(verifyTeamActivityPositions[index].getX(), verifyTeamActivityPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时0.3s
        robot.delay(300);
    }

    private void clickImpedimentaStart(Robot robot, int index) {
        robot.mouseMove(impedimentaStartPositions[index].getX(), impedimentaStartPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时0.5s
        robot.delay(500);
    }

    private void clickImpedimentaSearchTeam(Robot robot, int index) {
        robot.mouseMove(impedimentaSearchTeams[index].getX(), impedimentaSearchTeams[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时0.5s
        robot.delay(500);
    }

    private void clickVerifyCreateTeam(Robot robot, int index) {
        robot.mouseMove(verifyCreateTeamPositions[index].getX(), verifyCreateTeamPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时3s
        robot.delay(3000);
    }

    private void clickCreateTeam(Robot robot, int index) {
        robot.mouseMove(createTeamPositions[index].getX(), createTeamPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时5s
        robot.delay(5000);
    }

    private void clickImpedimentaTeam(Robot robot, int index) {
        robot.mouseMove(impedimentaTeamPositions[index].getX(), impedimentaTeamPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时5s
        robot.delay(5000);
    }

    private void clickSeasonImpedimenta(Robot robot, int index) {
        robot.mouseMove(seasonImpedimentaPositions[index].getX(), seasonImpedimentaPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时0.3s
        robot.delay(300);
    }

    private void clickAnswerQuestion1(Robot robot, int index) {
        robot.mouseMove(answerQuestionPositions[index].getX(), answerQuestionPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时3s
        robot.delay(3000);
    }

    private void clickAnswerQuestion(Robot robot, int index) {
        robot.mouseMove(answerQuestionPositions[index].getX(), answerQuestionPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时0.3s
        robot.delay(300);
    }

    private void clickConversation1(Robot robot, int index) {
        robot.mouseMove(conversationPositions[index].getX(), conversationPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时3s
        robot.delay(3000);
    }

    private void clickConversation(Robot robot, int index) {
        robot.mouseMove(conversationPositions[index].getX(), conversationPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时0.3s
        robot.delay(300);
    }

    private void clickMapClose(Robot robot, int index) {
        robot.mouseMove(mapClosePositions[index].getX(), mapClosePositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时0.3s
        robot.delay(300);
    }

    private void clickImpedimentaPerson(Robot robot, int index) {
        robot.mouseMove(impedimentaPersonPositions[index].getX(), impedimentaPersonPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时0.3s
        robot.delay(300);
    }

    private void clickSocialClient(Robot robot, int index) {
        robot.mouseMove(socialClientPositions[index].getX(), socialClientPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时0.3s
        robot.delay(300);
    }

    private void clickSearchRoad(Robot robot, int index) {
        robot.mouseMove(searchRoadPositions[index].getX(), searchRoadPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时0.3s
        robot.delay(300);
    }

    private void clickMap(Robot robot, int index) {
        robot.mouseMove(mapPositions[index].getX(), mapPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时0.3s
        robot.delay(300);
    }

    private void clickFactionLocation(Robot robot, int index) {
        robot.mouseMove(factionLocationPositions[index].getX(), factionLocationPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时0.3s
        robot.delay(300);
    }

    private void clickFactionActivity(Robot robot, int index) {
        robot.mouseMove(factionActivityPositions[index].getX(), factionActivityPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时0.3s
        robot.delay(300);
    }

    private void clickFactionNotice(Robot robot, int index) {
        robot.mouseMove(factionNoticePositions[index].getX(), factionNoticePositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时0.3s
        robot.delay(300);
    }

    private void clickFaction(Robot robot, int index) {
        robot.mouseMove(factionPositions[index].getX(), factionPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时0.3s
        robot.delay(300);
    }

    private void clickMutiActivity(Robot robot, int index) {
        robot.mouseMove(mutiActivityPositions[index].getX(), mutiActivityPositions[index].getY());
        // 延时10毫秒
        robot.delay(10);
        // 按下鼠标左键
        robot.mousePress(InputEvent.BUTTON1_MASK);
        // 延时10毫秒
        robot.delay(10);
        // 释放鼠标左键（按下后必须要释放, 一次点击操作包含了按下和释放）
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
        //防止电脑卡顿，延时0.3s
        robot.delay(300);
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        this.group = ProcessEnum.IMPEDIMENTA.getType();
        this.globleId = this.generateGlobleId();
    }
}
